不是說三本柱嗎
怎麼會有4個
就跟四天王有五個一樣
介面其實跟抽象類別很像
都只宣告方法名稱 傳入類型 與 傳回類型
介面的使用焦點是放在操作物件這件事情上
而繼承則是把重點放在屬性與方法的重複使用上
我們先來看看怎麼宣告介面
我們使用interface 關鍵字來宣告
通常 介面跟class 一樣會另外拉出一個檔案來寫
介面名稱通常會用大寫I開頭
通常介面不會放在class下面 而是跟class一樣在namespace下面
public interface 介面名稱{
public 傳入類型 方法名稱(傳入參數);//指宣告方法不實作 (沒有大括弧{})
}
我們繼續拿前幾天的例子來說明
我們有動物類別 狗勾類別,跟鳥鳥類別他們都繼承至動物類別
但是我會稍微修改下鳥鳥類別
讓他多一個fly的方法
Animal.cs
using System;
namespace Inheritance
{
public abstract class Animal
{
protected string Name;
public virtual void Move()
{
Console.WriteLine("Move");
}
public void GetName()
{
Console.WriteLine($"動物的名字是{Name}");
}
public abstract void Eat();
}
}
Dog.cs
using System;
namespace Inheritance
{
public class Dog : Animal
{
public Dog()
{
Name = "Dog";
}
public void WagTail()
{
Console.WriteLine($"{Name}搖了搖尾巴");
}
public override void Eat()
{
Console.WriteLine($"{Name}吃肉");
}
}
}
Bird.cs
using System;
namespace Inheritance
{
public class Bird:Animal
{
public Bird()
{
Name = "Bird";
}
public override void Move()
{
Console.WriteLine("Jump");
}
public override void Eat()
{
Console.WriteLine($"{Name}吃蟲");
}
public void fly(){
Console.WriteLine("阿罵你金罵低叨威 我在天上飛");
}
}
}
如果今天我們想讓狗勾跟鳥鳥一樣飛起來
我們可以讓狗勾實作IFly這個介面
public interface IFly{
public void Fly();
}
跟繼承一樣
我們使用:來實作介面
用,隔開要繼承與要實做的介面
C#可以多重實作介面 但只能單一繼承
很重要所以再提一次
Dog.cs
using System;
namespace Inheritance
{
public class Dog : Animal,IFly
{
public Dog()
{
Name = "Dog";
}
public void WagTail()
{
Console.WriteLine($"{Name}搖了搖尾巴");
}
public override void Eat()
{
Console.WriteLine($"{Name}吃肉");
}
public override void Fly()
{
Console.WriteLine($"開靈車甩尾棺材飛 媽你看阿罵在天上飛");
}
}
}
Main
void Main(){
Dog dog = new Dog();//因為animal沒有實作IFly所以不會飛
dog.fly();
}
//開靈車甩尾棺材飛 媽你看阿罵在天上飛
我們成功讓狗勾飛起來了
一樣扯到介面隔離原則(ISP)原則
事實上介面也是一種"抽象"
正如前幾篇所言
寫成是要針對抽象來寫
在後面幾篇介紹完solid應該就能有比就深刻的感覺
(所以可以先擱著)
這一個部分其實會在solid的最後一項d(Dependency inversion principle)仔細介紹
但是畢竟他是三本柱之一
所以我還是要加減提一下
我們先來看看這張
(偽)UML圖
在物件依賴圖裡面
當A使用到B class
我們稱A依賴B
人吃蘋果
所以人依賴蘋果
今天我們加了一個食物的介面
讓人去依賴食物介面
蘋果因為實作食物介面
所以也依賴食物介面
依賴關係就反向了
雖然字數變少了
但是忙到有點想棄坑了OTZ
不過頭都洗一半了
就乖乖洗完吧
共勉之